define(function(require, exports){
	var $ = require("jquery");
	var pubjs = require('pubjs');
	var util = require('util');
	var view = require('@base/view');
	var CryptoJS = require('md5');

	// 登录界面
	var Login = view.container.extend({
		init: function(config, parent){
			config = pubjs.conf(config, {
				'class': 'P-Login',
				//'tag': 'form',
				'url': '/login',
				'success': null
				//'attr': {
				//	'action': ROOT('/data/fack.html'),
				//	'method': 'POST',
				//	'target': '__SYS_USER_LOGIN_FRAME__'
				//}
			});

			this.$doc = $(document);

			this.Super('init', arguments);
		},
		afterBuild: function(){
			var self = this;
			// var c = self.getConfig();
			var el = self.getDOM();

			// 构建界面内容
			$([
				'<div class="P-LoginLogo"><img src="'+ pubjs.config('app_logo/big') +'" /></div>',

				'<div class="P-LoginBody">',
					'<div class="form-group">',
						'<input autofocus id="LoginFormEmail" class="email form-element" type="text" name="email" placeholder="'+LANG("请输入您的邮箱")+'">',
						'<span class="email-error"/>',
					'</div>',
					'<div class="form-group">',
						'<input id="LoginFormPass" class="pass form-element" type="password" name="pass" placeholder="'+LANG("请输入您的密码")+'">',
						'<span class="pass-error"/>',
					'</div>',

					'<div class="form-group option">',
						'<label class="">',
							'<input type="checkbox" class="remember" />',
							LANG("记住邮箱"),
						'</label>',
						'<label class="">',
							'<input type="checkbox" class="auto" />',
							LANG("自动登录"),
						'</label>',
					'</div>',

					'<div class="form-group buttonBar">',
						'<button class="submit btn btn-danger">'+LANG("登录")+'</button>',
					'</div>',
				'</div>'

				//'<iframe name="__SYS_USER_LOGIN_FRAME__" style="display:none;"></iframe>'

			].join('')).appendTo(el);

			self.$doms = {
				userError: el.find('.email-error'),
				passError: el.find('.pass-error'),
				user: el.find('.email'),
				pass: el.find('.pass'),
				remember: el.find('.remember'),
				auto: el.find('.auto')
			};

			// 绑定事件
			self.uiProxy('.submit', 'click', 'eventSubmit');
			self.uiProxy(el, '.form-element', 'keypress', 'eventKeyPress');
			// 绑定document回车事件
			this.bindEvent();

			// 初始化表单
			self.reset();
			var loginUrl = pubjs.config('loginUrl');
			if(loginUrl){
				$.ajax({
					type : "get",
					async: false,
					url : loginUrl,
					dataType : "jsonp", //数据类型为jsonp
					jsonp: "callback", //服务端用于接收callback调用的function名的参数
					success : function(data){
						if(!data.error){
							if(data.data && data.data.ticket){
								pubjs.loading.show();
								pubjs.mc.send(
									self.getConfig('url'),
									{
										ticket: data.data.ticket
									},
									function(err,data){
										pubjs.loading.hide();
										self.afterLoad(err, data);
									}
								);
							}
						}
					}
				});
			}

			return self;
		},
		// 重置表单
		reset: function(){
			var doms = this.$doms;
			var username = util.cookie(pubjs.config('login/user_cookie_name'));
			username = username && decodeURIComponent(username);

			doms.user.removeClass('f-is-danger').val(username || '');
			doms.pass.removeClass('f-is-danger').val('');
			doms.userError.html('');
			doms.passError.html('');

			doms.remember.prop('checked', Boolean(username));
			doms.auto.prop('checked', false);

			return this;
		},
		// 输入框按键事件
		eventKeyPress: function(evt, elm){
			if (evt.type == 'keypress'){
				if(evt.keyCode == 13 && (elm.id == 'LoginFormEmail' || elm.id == 'LoginFormPass')){
					this.eventSubmit(evt, elm);
					return false;
				}
			}
		},
		// 表单提交事件
		eventSubmit: function(evt, elm){
			if(!evt){
				return false;
			}
			var self = this;
			var data = this.checkForm();
			if (!data || !evt || !elm){
				// 资料不正确, 不提交
				return false;
			}
			var salt = Math.random().toString();
			var codem5 = CryptoJS.MD5(data.pass).toString();
			var code = CryptoJS.HmacMD5(codem5,salt).toString();
			var loginUrl = pubjs.config('loginUrl') + '?userName='+data.user+'&pass='+code+'&salt='+ salt;

			$.ajax({
				type : "get",
				async: false,
				url : loginUrl,
				dataType : "jsonp", //数据类型为jsonp
				jsonp: "callback", //服务端用于接收callback调用的function名的参数
				success : function(data){
					if(!data.error){
						//alert('请求成功,'+data.message);
						if(data.data && data.data.ticket){
							pubjs.mc.send(
								self.getConfig('url'),
								{
									ticket: data.data.ticket
								},
								function(err,data){
									self.afterLoad(err, data);
								}
							);
						}
					}
					else{
						pubjs.loading.hide();
						self.getDOM().find('.form-element').blur();
						pubjs.alert(LANG('系统登录失败：')+data.error.message, function(){
							if(data.error.code == 12302){
								self.$doms.pass.select();
							}else{
								self.$doms.user.select();
							}
						});
					}
				},
				error:function(){
					pubjs.alert(LANG('请求失败，请检查网络接口！'));
				}
			});
		},
		// 登录请求响应事件
		afterLoad: function(err, data, param){
			pubjs.loading.hide();
			if (err){
				if (err.message){
					pubjs.alert(err.message);
				}
				pubjs.error(err);
				return false;
			}

			var self = this;
			// 重置表单
			self.reset();
			self.$user = data.userInfo;

			// 登陆成功后隐藏登陆框
			self.hide();

			// 登录后续处理
			var callback = this.getConfig('success');
			if (util.isFunc(callback)){
				callback(data.userInfo);
				// 登陆后解除document回车事件
				this.bindEvent(true);
			}
		},
		onSwitchSuccess: function(e){
			var data = e.param;
			var callback = this.getConfig('success');
			if (util.isFunc(callback)){
				callback(data.userInfo);
				// 登陆后解除document回车事件
				this.bindEvent(true);
			}
		},
		// 检查表单并返回表单值
		checkForm: function(field){
			var doms = this.$doms;
			var username = util.trim(doms.user.val());
			var password = doms.pass.val();

			if (!field || field == 'LoginFormPass'){
				doms.pass.toggleClass('P-userLoginFormInvalid', !password);
				if (password){
					doms.passError.text('');
				}else {
					doms.passError.text(LANG('请输入帐号密码!'));
				}
			}

			if (!field || field == 'LoginFormEmail'){
				if (util.isEmail(username)){
					doms.userError.text('');
					doms.user.removeClass('P-userLoginFormInvalid');
				}else {
					doms.userError.text(LANG('请输入一个邮箱地址作为登录用户!'));
					doms.user.addClass('P-userLoginFormInvalid');
					username = false;
				}
			}

			if (!username){
				if (!field){
					doms.user.focus();
				}
			}else if (!password){
				if (!field){
					doms.pass.focus();
				}
			}else {
				return {
					user: username,
					pass: password,
					remember: doms.remember.prop('checked'),
					auto: doms.auto.prop('checked')
				};
			}
			return false;
		},
		/**
		 * 监测keyup事件，响应用户回车输入
		 * @param  {bool}   unbind 为真时解除绑定
		 * @return {Object}        模块实例
		 */
		bindEvent:function(unbind){
			if(unbind){
				// this.$doc.unbind("keyup",_loginKeyupHandler);
			}else{
				// this.$doc.bind("keyup",this,_loginKeyupHandler);
			}
			return this;
		},
		/**
		 * 显示登录框
		 * @return {Undefined} 无返回值
		 */
		show:function(){
			// 绑定document回车事件
			this.bindEvent();
			this.Super('show', arguments);
		}
	});
	/**
	 * 登录框按键keyup响应函数
	 * @param  {Object} ev DOM消息对象
	 * @return {Bool}      flase
	 */
	// function _loginKeyupHandler(ev){
	// 	if(ev.keyCode == 13){
	// 		ev.data.eventSubmit();
	// 	}
	// }
	exports.login = Login;

	// 修改密码
	var Password = view.container.extend({
		init: function(config, parent){
			config = pubjs.conf(config, {
				'class': 'P-userLoginPassword',
				'labels':[LANG('邮箱帐号：'),LANG('新的密码：'),LANG('确认密码：')]
			});
			this.Super('init', arguments);
		},
		afterBuild: function(){
			var self = this;
			var c = self.getConfig();

			var con = [
				'<div class="uk-form">',
					'<div class="email mb15">',
						'<label class="mr15">'+c.labels[0]+'</label>',
					'</div>',
					'<div class="password mb15">',
						'<label class="mr15">'+c.labels[1]+'</label>',
					'</div>',
					'<div class="verify mb15">',
						'<label class="mr15">'+c.labels[2]+'</label>',
					'</div>',
					'<div class="inputField cl"></div>',
				'</div>'
			].join("");

			self.append(con);

			var doms = self.$doms = {
				email: self.find('.email'),
				password: self.find('.password'),
				verify: self.find('.verify'),
				inputField: self.find('.inputField')
			}

			self.createAsync("email", '@base/common/input.text',{
				'value':pubjs.getUser().current.username,
				'width': 300,
				"target":doms.email,
				'attr':{
					'disabled':true
				}
			});

			self.createAsync("password", '@base/common/input.text',{
				'value':'',
				'width': 300,
				'type':'password',
				"target":doms.password,
				'attr':{
					'placeholder':LANG('请输入新的密码')
				}
			});

			self.createAsync("verify", '@base/common/input.text',{
				'value':'',
				'width': 300,
				'type':'password',
				"target":doms.verify,
				'attr':{
					'placeholder':LANG('请再次输入新密码')
				}
			});

			self.createAsync('save', '@base/common/input.button', {
				'target': doms.inputField,
				'class': 'btn btn-confirm mr20 mt15',
				'value': LANG('保存')
			});

			self.createAsync('cancel', '@base/common/input.button', {
				'target': doms.inputField,
				'class': 'btn btn-link mt15',
				'value': LANG('取消')
			});
		},
		onInputClick: function(ev){
			if (ev.from === this.$.save){
				this.save();
			}
			if (ev.from === this.$.cancel){
				this.back();
			}
			return false;
		},
		save: function(){
			var data = this.getData();
			//表单检测
			if (!data.password||!data.verify){
				pubjs.alert(LANG('请填写密码。'));
				return false;
			}

			if (data.password !== data.verify){
				pubjs.alert(LANG('两次密码输入不一致。'));
				return false;
			}

			pubjs.loading.show();
			pubjs.data.put('/user/setpassword', {
				'passwd': data.password
			}, this, 'onSave');
		},
		onSave:function(err,data){
			pubjs.loading.hide();
			if(err){
				pubjs.error(err.message);
				pubjs.alert(err.message);
				return false;
			}
			pubjs.alert(LANG('修改成功！请刷新页面。'));
		},
		back: function(){
			pubjs.controller.navigate(-1);
		},
		reset: function(){
			this.$.password.setValue('');
			this.$.verify.setValue('');
		},
		getData: function(){
			var data = {
				'password': this.$.password.getValue(),
				'verify': this.$.verify.getValue()
			};
			return data;
		}
	});
	exports.password = Password;
});